//
//  MYUserAccountViewModel.swift
//  MYWeibo
//
//  Created by Magic Yu on 16/4/14.
//  Copyright © 2016年 Magic Yu. All rights reserved.
//

import UIKit

/*

封装业务逻辑处理
封装网络处理
封装数据缓存

*/

private let userInfoDefaultKey = "magic_yu1212"
class MYUserAccountViewModel: NSObject {

    //因为开发中需要经常用到 非常多的类会找ViewModel获取数据 所以弄一个单例类
    //创建一个单例对象
    static let sharedAccountViewModel: MYUserAccountViewModel = MYUserAccountViewModel()
    
    //创建一个模型属性
    var userAccount: MYUserAccount?
    
    //添加一个计算的属性(只读)
    var userLogin: Bool {
        
        //判断access_token != nil 并且没有过期
        //过期日期 大于 当前日期
        if let u = userAccount where u.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
        
            return true
        }
        
        //如果过期了 需要手动将userAccount设置为nil
        userAccount = nil
        return false
        
    }
    
    //添加头像URL属性
    var userImageURL: NSURL? {
    
        let url = NSURL(string: userAccount?.avatar_large ?? "")
        return url
    }
    
    //私有化构造函数 保证单例的唯一
    private override init() {
        super.init()
        //在初始化的时候就给模型属性赋值 提高效率 只会从沙盒中读取一次 以后都是从内存中读取数据 
        userAccount = loadAccount()
    }
    
    
}

//MARK:用户相关的网络请求
extension MYUserAccountViewModel {

    //获取accessToken
    //方法不能私有 外界访问不到
    //弹框应该是控制器做的事情 不归ViewModel管 所以通过闭包将登录是否成功的状态传递出去
    func loadAccessToken(code: String,finished: (isSuccess: Bool) -> ()) {
        
        HMNetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            
            if error != nil {
                //                SVProgressHUD.showErrorWithStatus("世界上最遥远的距离就是没网/(ㄒoㄒ)/~~")
                //                print(error)
                finished(isSuccess: false)
                return
            }
            
            //程序走到这里 说明没有error 一定成功
            //print("授权成功")
            
            //在请求成功的回调在中获取用户信息
            //程序走到这 result一定有值 所以是必选项
            self.loadUserInfo(result!, finished: finished)
            
        }
        
}
    
    //需要传入accessToken和uid 因为这两个都在result里 所以传一个result就可以 并且是字典
    private func loadUserInfo(tokenResult: AnyObject,finished: (isSuccess: Bool) -> ()) {
        
        guard let dict = tokenResult as? [String: AnyObject] else {
            //SVProgressHUD.showErrorWithStatus("数据错误")
            finished(isSuccess: false)
            return
        }
        
        //print(dict)
        //字典中不能添加nil,而可选项有可能是nil 所以要转换为必选项
        let token = dict["access_token"]!
        let uid = dict["uid"]!
        
        //需要获取accesstoken和uid
        HMNetworkTools.sharedTools.loadUserInfo(token, uid: uid) { (result, error) -> () in
            
            if error != nil {
                //SVProgressHUD.showErrorWithStatus("世界上最遥远的距离就是没网/(ㄒoㄒ)/~~")
                finished(isSuccess: false)
                return
            }
            
            //print("获取用户信息成功")
            //print(result)
            
            
            //将用户信息保存起来
            //合并字典(因为两个字典result中均有我们需要的信息)
            
            //将result转为字典后 和tokenResult转换后的字典合并
            guard var userInfoDict = result as? [String: AnyObject] else {
                //                SVProgressHUD.showErrorWithStatus("数据错误")
                finished(isSuccess: false)
                return
            }
            
            //合并字典
            //遍历dict 将dict中的值添加到userI nfoDict中
            for(k,v) in dict {
                userInfoDict[k] = v
            }
            
            //print(userInfoDict)
            
            //存储用户信息
            self.saveAccount(userInfoDict)
            
            //保存用户信息成功后再执行成功的回调
            finished(isSuccess: true)
            
            //print(NSHomeDirectory())
            
        }

    }
    
}


//MARK:存储数据,读取数据
extension MYUserAccountViewModel {

    //将用户信息存储到沙盒中
    func saveAccount(userInfoDict: [String: AnyObject]) {
    
        //保存完整的字典信息
        let userDefault = NSUserDefaults.standardUserDefaults()
        //            userDefault.setObject(userInfoDict, forKey: userInfoDefaultKey)
        
        //reason: 'Attempt to insert non-property list object   偏好设置中不能保存nil 会崩溃
        
        //1.将字典信息转换为模型对象
        let account = MYUserAccount(dict: userInfoDict)
        
        //给模型属性赋值 为了解决从未登录状态到登录状态用户账户信息为空的问题
        self.userAccount = account
        
        //2.获取模型对象的字典信息
        let keys = ["access_token","avatar_large","name","expires_in","uid","expires_date"]
        let accountDict = account.dictionaryWithValuesForKeys(keys)
        //3.将对象的字典信息保存到偏好设置中
        userDefault.setObject(accountDict, forKey: userInfoDefaultKey)
        //4.同步
        userDefault.synchronize()
 
    }
    
    //从沙盒中读取数据 返回值是MYUserAccount
    //会多次调用 频繁地从沙盒读取数据 效率低 损耗性能
    func loadAccount() -> MYUserAccount? {
    
        //获取字典信息
        //当用户第一次登录的时候 沙盒中的数据是不存在的 强制解包会崩
        //fatal error: unexpectedly found nil while unwrapping an Optional value
        //解决办法:判断 当数据为空的时候 返回nil
        guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInfoDefaultKey) as? [String: AnyObject] else {
                return nil
        }
        //将字典转成模型
        let account = MYUserAccount(dict: dict)
        //返回模型数据
        return account
    }
    
}



